/*
Copyright 2011 Mary Suárez Machado

Este programa es de software libre: usted puede redistribuirlo y/o modificarlo según los términos de la Licencia de Gran pública de GNU como publicado por la Fundación de Software Libre, versión 3 de la Licencia, (o en su opción) cualquier versión posterior.

 Este programa es distribuido en la esperanza que será útil, pero SIN CUALQUIER GARANTÍA; sin aún la garantía implícita de VALOR COMERCIAL O SALUD PARA UN OBJETIVO PARTICULAR. Mirar la Licencia de Gran pública de GNU para más detalles.
*/


#ifndef _LZCODER_H_
#define _LZCODER_H_

#include <iostream>
#include <Cadena.h>

 /**
 *@file LZcoder.h
 *@brief Interfaz para comprimir un texto con el algoritmo LZ77 
 *
 */

 /**
 * \class LZcoder
 *
 * \brief Modulo que representa al algoritmo LZ77 de compresión
 *         
 * \author Mary Carmen Suárez 
 *
 * Especificacion:
 * @li Para que se comprima el texto, las subcadenas que coincidan tienen que ser al menos de tamaño 3
 * @li La longitud máxima posible para una coincidencia es de 258
 * @li La distancia máxima a la que puede estar la subcadena de nuestra posición actual es de 32768 caracteres.
 *
 */
	class LZcoder
	{
		private:
			Cadena cad;
			int dist_max,indice;
			/**
			@brief Operador de asignación
			@param orig, x=orig
			@return devuelve x con los valores de orig
			*/
			LZcoder & operator= (const LZcoder & orig);
			/**
			@brief Constructor de copia
			@param orig, tipo de dato que va a ser copiado
			*/
			LZcoder (const LZcoder & orig);
		public:
			/**
			@brief Constructor por defecto
			@pos inicializa todo a cero
			*/
			LZcoder();
			/**
			@brief Destructor
			@pos libera toda la memoria reservada
			*/
			~LZcoder();
			/**
			@brief Lee datos 
			*/
			void Leer(std :: istream & is);
			/**
			@brief Calcula el siguiente codigo de la cadena
			@return devuelve dicho codigo como un entero
			*/
			int SiguienteCodigo();
			/**
			@brief Calcula el siguiente codigo de la cadena buscando la cadena mas larga
			@return devuelve dicho codigo como un entero
			*/
			int SiguienteCodigoMejor();
			/**
			@return devuelve el tamaño de la cadena
			*/
			int GetTamano()const;
			/**
			@return devuelve la distancia 
			*/
			int GetDistancia () const;
			/**
			*@brief Calculo del crc32
			*@return Devulve el crc32 de la cadena
			*/
			unsigned int GetParidad () const;
};

#endif
